2-1 多环境配置两种方案(优缺点比较)
应用程序通常在不同的环境中运行,根据环境(Development、Production)的不同,应该使用不同的配置设置。由于配置变量会更改,最佳实践是将配置变量存储在环境变量中。
方案一:dotenv
dotenv 是一个非常流行的库,可以将 .env 文件中的键值对解析并挂载到 process.env 上。它的 NPM 周下载量非常大,版本已到 v16,非常稳定。
安装:
npm install dotenv
bash
使用方式:
CommonJS 规范:
require('dotenv').config();
// 之后通过 process.env 读取变量
javascript
ES Module 规范:
import * as dotenv from 'dotenv';
dotenv.config();
javascript
优点:
- 应用面非常广,几乎所有前端框架和后端应用都在使用
- 简单直接,解析
.env文件即可
缺点:
- 只能解析
.env格式文件,功能比较单一 - 不支持嵌套类型数据,需要用前缀(如
DATABASE_USERNAME)区分层级 - 多环境配置(如
.env.development、.env.production)需要手动指定文件 - 配置项多时,键名冗长不直观
方案二:config 库
config 库是 Node 环境下读取配置文件的另一个通用方案。它不仅支持 .json 格式,还支持 .yaml 格式等多种文件格式。
安装:
npm install config js-yaml
bash
JSON 格式配置示例:
创建 config/default.json:
{
"server": {
"happy": "my default value"
}
}
json
config/development.json:
{
"server": {
"port": 3001,
"host": "localhost",
"username": "test",
"password": "test"
}
}
json
config/production.json:
{
"server": {
"port": 3002,
"host": "localhost",
"username": "prod",
"password": "prod"
}
}
json
使用方式:
const config = require('config');
const dbConfig = config.get('db');
console.log(dbConfig.port); // 直接访问嵌套属性
javascript
自动合并多环境配置:
# 设置 NODE_ENV 后,config 库自动合并 default + 对应环境配置
export NODE_ENV=production
node index.js
bash
当 NODE_ENV=production 时,config 会自动合并 default.json 和 production.json,环境配置会覆盖 default 中的同名属性。
YAML 格式同样支持:
config/default.yml:
token:
secret: long_secret
db:
host: localhost
port: 5432
yaml
config/production.yml:
db:
host: yourdomain.com
yaml
注意: YAML 格式需要额外安装 js-yaml 解析器,因为 config 本身不内置 YAML 库。
优点:
- 直接支持 JSON 和 YAML 格式
- 支持嵌套结构,配置读写非常方便
- 自动合并不同环境的配置(
default.json+development.json/production.json) - 可通过扩展解析器支持更多格式
缺点:
- 校验需要在读取位置手动添加
- 相比 dotenv 稍重
脚本配置
配合 cross-env 库可以在 package.json 中设置不同的环境:
npm install cross-env -D
bash
{
"scripts": {
"start:dev": "cross-env NODE_ENV=development node index.js",
"start:prod": "cross-env NODE_ENV=production node index.js"
}
}
json
两种方案对比
| 特性 | dotenv | config |
|---|---|---|
| 文件格式 | .env 键值对 | .json、.yaml 等 |
| 嵌套数据 | 不支持,需前缀 | 原生支持 |
| 多环境 | 需手动指定文件路径 | 自动合并 default + 环境配置 |
| 校验 | 无 | 需手动添加 |
| 适用场景 | 简单配置、广泛兼容 | 复杂配置、结构化数据 |
对于简单的配置场景,dotenv 已经足够。对于需要嵌套结构、多环境自动合并的场景,config 库更为方便。在 NestJS 中,官方推荐使用 @nestjs/config 模块,它内置了 dotenv 并在此基础上做了封装。
↑